package com.moyoutian.leetcode.jianzhi.special.assault;

import java.nio.charset.StandardCharsets;

/**
 * 剑指 Offer II 002. 二进制加法
 * 给定两个 01 字符串 a 和 b ，请计算它们的和，并以二进制字符串的形式输出。
 * <p>
 * 输入为 非空 字符串且只包含数字 1 和 0。
 * <p>
 * <p>
 * <p>
 * 示例 1:
 * <p>
 * 输入: a = "11", b = "10"
 * 输出: "101"
 * <p>
 * 示例 2:
 * <p>
 * 输入: a = "1010", b = "1011"
 * 输出: "10101"
 * <p>
 * <p>
 * <p>
 * 提示：
 * <p>
 * 每个字符串仅由字符 '0' 或 '1' 组成。
 * 1 <= a.length, b.length <= 10^4
 * 字符串如果不是 "0" ，就都不含前导零。
 */
public class Demo002 {

    public static void main(String[] args) {
//        byte[] a = {48};
        String a = "12121", b = "";
        System.out.println(addBinary(a, b));
    }

    public static String addBinary(String a, String b) {
        if (a == null || a.length() == 0) {
            return b;
        } else if (b == null || b.length() == 0) {
            return a;
        }

        int len = Math.max(a.length(), b.length());
        char[] re = new char[len + 1];

        //是否存在进位
        boolean temp = false;
        for (int i = 0; i < len; i++) {
            char tempA = '0';
            int aI = a.length() - 1 - i;
            if (aI >= 0 && aI < a.length()) {
                tempA = a.charAt(aI);
            }
            char tempB = '0';
            int bI = b.length() - 1 - i;
            if (bI >= 0 && bI < b.length()) {
                tempB = b.charAt(bI);
            }
            if (temp) {
                //三个一相加
                if (tempA == '1' && tempB == '1') {
                    temp = true;
                    re[re.length - 1 - i] = '1';
                } else if (tempA == '1' || tempB == '1') {
                    re[re.length - 1 - i] = '0';
                    temp = true;
                } else {
                    re[re.length - 1 - i] = '1';
                    temp = false;
                }
            } else {
                //两个一相加
                if (tempA == '1' && tempB == '1') {
                    re[re.length - 1 - i] = '0';
                    temp = true;
                } else if (tempA == '1' || tempB == '1') {
                    temp = false;
                    re[re.length - 1 - i] = '1';
                } else {
                    re[re.length - 1 - i] = '0';
                    temp = false;
                }
            }
        }
        if (temp) {
            re[0] = '1';
            return String.valueOf(re);
        } else {
            return String.valueOf(re, 1, re.length - 1);
        }
    }


}
